/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.scote.base.dao;

import com.scote.base.model.ConditionInfo;
import com.scote.base.model.DataGrid;
import com.scote.base.model.PageInfo;
import java.util.List;
import java.util.Map;

/**
 * 公共的DAO处理对象，这个对象中包含了Hibernate的所有基本操作和对SQL的操作
 *
 * @author YanPeng
 * @param <T>
 */
public interface BaseDao<T> {

    /**
     * 插入一个对象
     *
     * @param t 要被持久化的对象
     * @return 持久化后的对象
     */
    T insert(T t);

    /**
     * 更新一个对象
     *
     * @param t 要被持久化的对象
     */
    void update(T t);

    /**
     * 根据HQL语句更新对象
     *
     * @param hql 更新的HQL语句
     * @param args 参数组
     * @param alias 别名映射
     */
    void update(String hql, Object[] args, Map<String, Object> alias);

    /**
     * 根据HQL语句更新对象
     *
     * @param hql 更新的HQL语句
     * @param alias 别名映射
     */
    void update(String hql, Map<String, Object> alias);

    /**
     * 根据HQL语句更新对象
     *
     * @param hql 更新的HQL语句
     * @param args 参数组
     */
    void update(String hql, Object[] args);

    /**
     * 根据HQL语句更新对象
     *
     * @param hql 更新的HQL语句
     * @param arg 参数
     */
    void update(String hql, Object arg);

    /**
     * 根据HQL语句更新对象
     *
     * @param hql 更新的HQL语句
     */
    void update(String hql);

    /**
     * 根据ID删除一个对象
     *
     * @param id 要被删除对象的ID
     */
    void delete(long id);

    /**
     * 删除一个对象
     *
     * @param t 要被删除对象
     */
    void delete(T t);

    /**
     * 获取一个对象
     *
     * @param id 要被加载对象的ID
     * @return 持久化的对象
     */
    T load(long id);

    /**
     * 获取一个对象
     *
     * @param id 要被加载对象的ID
     * @return 持久化的对象
     */
    T get(long id);

    /**
     * 根据HQL语句获取一个对象
     *
     * @param hql 要查询的HQL
     * @param args 参数组
     * @param alias 别名映射
     * @return 获取到的对象
     */
    T get(String hql, Object[] args, Map<String, Object> alias);

    /**
     * 根据HQL语句获取一个对象
     *
     * @param hql 要查询的HQL
     * @param alias 别名映射
     * @return 获取到的对象
     */
    T get(String hql, Map<String, Object> alias);

    /**
     * 根据HQL语句获取一个对象
     *
     * @param hql 要查询的HQL
     * @param args 参数组
     * @return 获取到的对象
     */
    T get(String hql, Object[] args);

    /**
     * 根据HQL语句获取一个对象
     *
     * @param hql 要查询的HQL
     * @param arg 参数
     * @return 获取到的对象
     */
    T get(String hql, Object arg);

    /**
     * 根据HQL语句获取一个对象
     *
     * @param hql 要查询的HQL
     * @return 获取到的对象
     */
    T get(String hql);

    /**
     * 根据HQL语句查询对象列表
     *
     * @param hql 要查询的HQL
     * @param args 参数组
     * @param alias 别名映射
     * @return 查询的结果列表
     */
    List<T> list(String hql, Object[] args, Map<String, Object> alias);

    /**
     * 根据HQL语句查询对象列表
     *
     * @param hql 要查询的HQL
     * @param alias 别名映射
     * @return 查询的结果列表
     */
    List<T> list(String hql, Map<String, Object> alias);

    /**
     * 根据HQL语句查询对象列表
     *
     * @param hql 要查询的HQL
     * @param args 参数组
     * @return 查询的结果列表
     */
    List<T> list(String hql, Object[] args);

    /**
     * 根据HQL语句查询对象列表
     *
     * @param hql 要查询的HQL
     * @param arg 参数
     * @return 查询的结果列表
     */
    List<T> list(String hql, Object arg);

    /**
     * 根据HQL语句查询对象列表
     *
     * @param hql 要查询的HQL
     * @return 查询的结果列表
     */
    List<T> list(String hql);

    /**
     * 根据HQL语句统计数量
     *
     * @param hql
     * @param args
     * @param alias
     * @return 数量
     */
    long count(String hql, Object[] args, Map<String, Object> alias);

    /**
     * 根据HQL语句统计数量
     *
     * @param hql 要查询的HQL
     * @param alias 别名映射
     * @return 数量
     */
    long count(String hql, Map<String, Object> alias);

    /**
     * 根据HQL语句统计数量
     *
     * @param hql 要查询的HQL
     * @param args 参数组
     * @return 数量
     */
    long count(String hql, Object[] args);

    /**
     * 根据HQL语句统计数量
     *
     * @param hql 要查询的HQL
     * @param arg 参数
     * @return 数量
     */
    long count(String hql, Object arg);

    /**
     * 根据HQL语句统计数量
     *
     * @param hql 要查询的HQL
     * @return 数量
     */
    long count(String hql);

    /**
     * 根据SQL语句查询对象列表
     *
     * @param <N> 返回的对象类型
     * @param sql 查询SQL语句
     * @param args 参数组
     * @param alias 别名映射
     * @param hasEntity 是否是映射实体
     * @return 查询对象列表
     */
    <N extends Object> List<N> listBySql(String sql, Object[] args, Map<String, Object> alias, boolean hasEntity);

    /**
     * 根据SQL语句查询对象列表
     *
     * @param <N> 返回的对象类型
     * @param sql 查询SQL语句
     * @param alias 别名映射
     * @param hasEntity 是否是映射实体
     * @return 查询对象列表
     */
    <N extends Object> List<N> listBySql(String sql, Map<String, Object> alias, boolean hasEntity);

    /**
     * 根据SQL语句查询对象列表
     *
     * @param <N> 返回的对象类型
     * @param sql 查询SQL语句
     * @param args 参数组
     * @param hasEntity 是否是映射实体
     * @return 查询对象列表
     */
    <N extends Object> List<N> listBySql(String sql, Object[] args, boolean hasEntity);

    /**
     * 根据SQL语句查询对象列表
     *
     * @param <N> 返回的对象类型
     * @param sql 查询SQL语句
     * @param arg 参数
     * @param hasEntity 是否是映射实体
     * @return 查询对象列表
     */
    <N extends Object> List<N> listBySql(String sql, Object arg, boolean hasEntity);

    /**
     * 根据SQL语句查询对象列表
     *
     * @param <N> 返回的对象类型
     * @param sql 查询SQL语句
     * @param hasEntity 是否是映射实体
     * @return 查询对象列表
     */
    <N extends Object> List<N> listBySql(String sql, boolean hasEntity);

    /**
     * 根据SQL语句统计数量
     *
     * @param sql 查询SQL语句
     * @param args 参数组
     * @param alias 别名映射
     * @param hasEntity 是否是映射实体
     * @return 数量
     */
    long countBySql(String sql, Object[] args, Map<String, Object> alias, boolean hasEntity);

    /**
     * 根据SQL语句统计数量
     *
     * @param sql 查询SQL语句
     * @param alias 别名映射
     * @param hasEntity 是否是映射实体
     * @return 数量
     */
    long countBySql(String sql, Map<String, Object> alias, boolean hasEntity);

    /**
     * 根据SQL语句统计数量
     *
     * @param sql 查询SQL语句
     * @param args 参数组
     * @param hasEntity 是否是映射实体
     * @return 数量
     */
    long countBySql(String sql, Object[] args, boolean hasEntity);

    /**
     * 根据SQL语句统计数量
     *
     * @param sql 查询SQL语句
     * @param arg 参数
     * @param hasEntity 是否是映射实体
     * @return 数量
     */
    long countBySql(String sql, Object arg, boolean hasEntity);

    /**
     * 根据SQL语句统计数量
     *
     * @param sql 查询SQL语句
     * @param hasEntity 是否是映射实体
     * @return 数量
     */
    long countBySql(String sql, boolean hasEntity);

    /**
     * 获取DataGrid信息
     *
     * @param pageInfo 分页信息
     * @param example 模糊查询条件
     * @param conditions DataGrid信息
     * @return
     */
    DataGrid dataGrid(PageInfo pageInfo, Object example, List<ConditionInfo> conditions);

    /**
     * 获取DataGrid信息
     *
     * @param pageInfo 分页信息
     * @param example 模糊查询条件
     * @return DataGrid信息
     */
    DataGrid dataGrid(PageInfo pageInfo, Object example);
}
